// app.js
App({
  globalData: {
    userInfo: null,
    token: null,
    //apiBaseUrl: 'http://localhost:3000',
    apiBaseUrl: 'http://121.37.154.212',
    clientTokenReady: false,
    isLoggedIn: false,
    // 增加抖音授权相关的全局变量
    douyinAccessToken: null,
    douyinRefreshToken: null,
    douyinOpenid: null,
    // 版本信息
    version: '1.0.0',
    // 添加无需登录模式标志
    skipLoginMode: true,
    // 添加匿名用户默认信息
    anonymousUser: {
      nickName: '游客',
      credits: 10,
      freeCredits: 3
    }
  },
  
  onLaunch: function() {
    console.log('应用启动，初始化中...');
    // 不再从本地存储恢复token
    console.log('应用启动完成，不再从本地存储恢复token');
    
    // 获取client_token，用于不需要用户授权的API调用
    this.getClientToken();
    
    // 处于无需登录模式，设置默认登录状态
    if (this.globalData.skipLoginMode) {
      console.log('启用无需登录模式，设置默认登录状态');
      this.globalData.isLoggedIn = true; 
      this.globalData.userInfo = this.globalData.anonymousUser;
    }
  },
  
  // 显示加载提示
  showLoading: function(title = '加载中') {
    tt.showLoading({
      title: title,
      mask: true
    });
  },
  
  // 隐藏加载提示
  hideLoading: function() {
    tt.hideLoading();
  },
  
  // 检查登录状态 - 在无登录模式下始终返回成功
  checkLoginStatus: function() {
    console.log('检查登录状态');
    return new Promise((resolve, reject) => {
      // 如果启用了无需登录模式，直接返回成功
      if (this.globalData.skipLoginMode) {
        console.log('无需登录模式：直接返回成功状态');
        resolve(true);
        return;
      }
      
      if (!this.globalData.token) {
        console.log('无token，未登录状态');
        resolve(false);
        return;
      }
      
      console.log('有token，开始验证有效性');
      // 检查token是否有效
      const api = require('./utils/api.js');
      api.get('/api/user/check-token')
        .then(res => {
          if (res.valid) {
            console.log('token有效，获取用户信息');
            // token有效，获取用户信息
            return this.getUserInfo()
              .then(() => {
                console.log('获取用户信息成功，登录状态有效');
                resolve(true);
              })
              .catch(err => {
                console.error('获取用户信息失败', err);
                this.clearLoginInfo();
                resolve(false);
              });
          } else {
            console.log('token无效，清除登录信息');
            // token无效，清除登录信息
            this.clearLoginInfo();
            resolve(false);
          }
        })
        .catch(err => {
          console.error('检查token失败', err);
          resolve(false);
        });
    });
  },
  
  // 检查会话状态，用于功能访问检查
  checkSession: function() {
    return new Promise((resolve) => {
      // 如果启用了无需登录模式，直接返回成功
      if (this.globalData.skipLoginMode) {
        console.log('无需登录模式：会话检查直接返回成功');
        resolve(true);
        return;
      }
      
      const hasToken = !!this.globalData.token;
      
      if (!hasToken) {
        // 没有token，返回未登录状态
        resolve(false);
      } else {
        // 有token，检查是否仍然有效
        this.checkLoginStatus()
          .then(valid => {
            resolve(valid);
          })
          .catch(() => {
            resolve(false);
          });
      }
    });
  },
  
  // 登录方法 - 使用抖音登录
  login: function() {
    const self = this;
    console.log('启动登录流程');
    
    return new Promise((resolve, reject) => {
      // 使用抖音登录API流程
      self.showLoading('正在登录...');
      
      // 使用抖音开放平台授权流程
      console.log('使用抖音开放平台授权流程1');
      
      // 提示用户即将请求授权
      tt.showModal({
        title: '授权提示',
        content: '我们需要获取您的基本信息来提供更好的服务，请点击确定并在随后的窗口中允许授权。',
        success: (res) => {
          if (res.confirm) {
            console.log('用户同意授权提示，开始显示抖音授权对话框');
            
            // 使用showDouyinOpenAuth获取授权code，这是官方推荐的方式
            tt.showDouyinOpenAuth({
              scopeList: ['user.info', 'user.login'], // 添加user.login权限以获取更完整的登录权限
              success: (auth) => {
                console.log('获取抖音授权成功:', auth);
                
                if (auth && auth.code) {
                  // 使用授权码获取登录凭证
                  console.log('获取到抖音授权code:', auth.code);
                  
                  // 发送code到服务器换取登录凭证
                  const api = require('./utils/api.js');
                  api.post('/login', {
                    code: auth.code,
                    authType: 'open_auth'  // 标记为开放平台授权
                  }).then(res => {
                    console.log('登录接口返回数据:', res);
                    
                    if (res.code === 0 && res.token) {
                      // 只在内存中保存登录状态，不再存储到本地
                      self.globalData.token = res.token;
                      self.globalData.openid = res.openid;
                      console.log('登录成功，只在内存中保存token');
                      
                      // 如果返回了抖音access_token也只保存在内存中
                      if (res.access_token) {
                        // 只在内存中保存
                        self.globalData.douyinAccessToken = res.access_token;
                        self.globalData.douyinRefreshToken = res.refresh_token;
                        self.globalData.douyinOpenid = res.openid;
                        
                        console.log('已保存抖音access_token到内存中');
                      }
                      
                      // 更新全局状态
                      self.globalData.isLoggedIn = true;
                      console.log('全局登录状态更新为已登录');
                      
                      // 获取用户信息
                      self.getUserInfo().then((userInfo) => {
                        console.log('获取用户信息成功:', userInfo);
                        self.hideLoading();
                        resolve(true);
                      }).catch(err => {
                        console.error('获取用户信息失败', err);
                        self.hideLoading();
                        // 即使获取用户信息失败，登录过程也算成功了
                        resolve(true);
                      });
                    } else {
                      console.error('登录失败:', res.message || '未知错误');
                      self.hideLoading();
                      tt.showToast({
                        title: '登录失败: ' + (res.message || '未知错误'),
                        icon: 'none'
                      });
                      reject(new Error(res.message || '登录失败'));
                    }
                  }).catch(err => {
                    console.error('登录请求失败:', err);
                    self.hideLoading();
                    tt.showToast({
                      title: '登录失败: ' + (err.message || '网络错误'),
                      icon: 'none'
                    });
                    reject(err);
                  });
                } else {
                  console.error('授权成功但未获取到code');
                  self.hideLoading();
                  tt.showToast({
                    title: '授权失败: 未获取到授权码',
                    icon: 'none'
                  });
                  reject(new Error('未获取到授权码'));
                }
              },
              fail: (err) => {
                console.error('抖音授权失败:', err);
                // 添加更详细的错误日志
                if (err.errMsg) console.error('错误信息:', err.errMsg);
                if (err.errNo) console.error('错误码:', err.errNo);
                if (err.errorCode) console.error('错误代码:', err.errorCode);
                if (err.errorType) console.error('错误类型:', err.errorType);
                
                // 增加特定错误类型的处理
                if (err.errMsg && err.errMsg.includes('invalid scope')) {
                  console.error('权限范围无效，请检查scopeList设置');
                  self.hideLoading();
                  tt.showModal({
                    title: '授权失败',
                    content: '应用需要访问您的基本信息，请允许授权以继续使用',
                    showCancel: false
                  });
                } else if (err.errMsg && err.errMsg.includes('user cancel')) {
                  // 用户取消授权的情况
                  console.error('用户取消了授权流程');
                  self.hideLoading();
                  tt.showToast({
                    title: '您已取消授权，部分功能可能无法使用',
                    icon: 'none',
                    duration: 2000
                  });
                } else if (err.errNo === 21107 || err.errorCode === 117402) {
                  // 特定错误码处理
                  console.error('授权配置错误，请确认应用权限已正确配置');
                  self.hideLoading();
                  tt.showModal({
                    title: '授权失败',
                    content: '应用授权配置有误，请联系客服解决',
                    showCancel: false
                  });
                } else {
                  self.hideLoading();
                  tt.showToast({
                    title: '抖音授权失败: ' + (err.errMsg || '请检查网络并重试'),
                    icon: 'none'
                  });
                }
                reject(err);
              }
            });
          } else {
            // 用户拒绝授权提示
            console.log('用户拒绝授权提示');
            self.hideLoading();
            tt.showToast({
              title: '您已取消授权',
              icon: 'none'
            });
            reject(new Error('用户拒绝授权'));
          }
        }
      });
    });
  },
  
  // 获取用户信息 - 在无登录模式下返回默认用户信息
  getUserInfo: function() {
    return new Promise((resolve, reject) => {
      // 如果启用了无需登录模式，直接返回匿名用户信息
      if (this.globalData.skipLoginMode) {
        console.log('无需登录模式：返回匿名用户信息');
        resolve(this.globalData.anonymousUser);
        return;
      }
      
      if (!this.globalData.token) {
        reject(new Error('未登录'));
        return;
      }
      
      const api = require('./utils/api.js');
      api.get('/api/user/info')
        .then(res => {
          if (res.data && res.data.userInfo) {
            this.globalData.userInfo = res.data.userInfo;
            resolve(res.data.userInfo);
          } else {
            reject(new Error('获取用户信息失败'));
          }
        })
        .catch(err => {
          console.error('获取用户信息请求失败', err);
          reject(err);
        });
    });
  },
  
  // 清除登录信息
  clearLoginInfo: function() {
    this.globalData.token = null;
    this.globalData.userInfo = null;
    this.globalData.isLoggedIn = false;
    this.globalData.douyinAccessToken = null;
    this.globalData.douyinRefreshToken = null;
    this.globalData.douyinOpenid = null;
    
    // 在无登录模式下重新设置默认用户
    if (this.globalData.skipLoginMode) {
      this.globalData.isLoggedIn = true;
      this.globalData.userInfo = this.globalData.anonymousUser;
    }
    
    console.log('已清除内存中的登录信息');
  },
  
  // 刷新抖音授权token
  refreshDouyinToken: function() {
    const refreshToken = this.globalData.douyinRefreshToken;
    
    if (!refreshToken) {
      console.log('无refresh_token，无法刷新');
      return Promise.reject(new Error('无refresh_token'));
    }
    
    console.log('开始刷新抖音授权token');
    const api = require('./utils/api.js');
    return api.post('/api/refresh-token', { refresh_token: refreshToken })
      .then(res => {
        if (res.code === 0 && res.access_token) {
          // 只更新内存中的token
          this.globalData.douyinAccessToken = res.access_token;
          this.globalData.douyinRefreshToken = res.refresh_token;
          
          console.log('抖音授权token刷新成功，已更新到内存');
          return res;
        } else {
          throw new Error(res.message || '刷新token失败');
        }
      })
      .catch(err => {
        console.error('刷新抖音授权token失败:', err);
        throw err;
      });
  },
  
  // 获取client_token
  getClientToken: function() {
    const api = require('./utils/api.js');
    
    api.getClientToken()
      .then(token => {
        console.log('已获取client_token');
        this.globalData.clientTokenReady = true;
      })
      .catch(err => {
        console.error('获取client_token失败:', err);
        
        // 60秒后重试
        setTimeout(() => {
          this.getClientToken();
        }, 60000);
      });
  }
}); 